#ifndef ELIBC_SET_H
#define ELIBC_SET_H

#include "skip_list.h"

typedef SkipListIterator SetIterator;
typedef SkipList Set;

// SetIterator {

void * setIteratorData(const SetIterator * iterator);

SetIterator * setIteratorPrev(const SetIterator * iterator);

SetIterator * setIteratorNext(const SetIterator * iterator);

// }

// Set {

Set * setNew(FunctionLessThan lessThan, FunctionOnErased onErased);

void setDelete(Set * set);

SetIterator * setBegin(const Set * set);

SetIterator * setEnd(const Set * set);

int setIsEmpty(const Set * set);

void setClear(Set * set);

SetIterator * setInsert(Set * set, const void * data);

SetIterator * setErase(Set * set, const void * data);

SetIterator * setEraseIf(Set * set, const void * key, FunctionLessThan lessThanKey, FunctionLessThan keyLessThan);

SetIterator * setFind(const Set * set, const void * data);

SetIterator * setFindIf(const Set * set, const void * key, FunctionLessThan lessThanKey, FunctionLessThan keyLessThan);

void setPrint(const Set * set);

void setPrintSize(const Set * set);

// }

// SetForInt {

Set * setForIntNew();

SetIterator * setForIntInsert(Set * set, int data);

SetIterator * setForIntErase(Set * set, int data);

SetIterator * setForIntFind(const Set * set, int data);

// }

// SetForUInt {

Set * setForUIntNew();

SetIterator * setForUIntInsert(Set * set, unsigned int data);

SetIterator * setForUIntErase(Set * set, unsigned int data);

SetIterator * setForUIntFind(const Set * set, unsigned int data);

// }

#endif // ELIBC_SET_H
